




template<class R, class ... Args, class C>
struct FunctionTraits<R  __CALL(Args...) __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, false, false,__ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, false, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) volatile __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, false, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const volatile __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, false, false, __ISNOEXCEPT>
{
};

/************************************************************************/
/*                                                                      */
/************************************************************************/

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...)& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, true, true, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, true, true, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) volatile& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, true, true, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const volatile& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, true, true, __ISNOEXCEPT>
{
};

/************************************************************************/
/*                                                                      */
/************************************************************************/
template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) && __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, true, false, __ISNOEXCEPT>
{
};


template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const&& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, true, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) volatile&& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, true, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args...) const volatile&& __NOEXCEPT, C > :
	ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, true, false, __ISNOEXCEPT>
{
};
/************************************************************************/
/*                                                                      */
/************************************************************************/

#ifdef VARIADIC

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, false, false, __ISNOEXCEPT>
{
};


template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, false, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) volatile __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, false, false, __ISNOEXCEPT>
{
};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const volatile __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, false, false, __ISNOEXCEPT>
{
};
/************************************************************************/
/*                                                                      */
/************************************************************************/

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...)& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, true, true, __ISNOEXCEPT>
{	};


template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, true, true, __ISNOEXCEPT>
{	};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) volatile& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, true, true, __ISNOEXCEPT>

{	};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const volatile& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, true, true, __ISNOEXCEPT>

{};

/************************************************************************/
/*                                                                      */
/************************************************************************/
template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) && __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, false, true, false, __ISNOEXCEPT>

{};


template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const&& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, false, true, false, __ISNOEXCEPT>
{};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) volatile&& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < false, true, true, false, __ISNOEXCEPT>

{};

template<class R, class ... Args, class C>
struct FunctionTraits<R __CALL(Args..., ...) const volatile&& __NOEXCEPT, C > :ArgumentsTraits< R(Args...), C >,
	QualificationTraits < true, true, true, false, __ISNOEXCEPT>
{};

#endif

